﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using GestorDeFlotasModelo.Entities;
using GestorDeFlotasModelo.Factorias;
using GestorDeFlotasDesktop.UILogic;
using GestorDeFlotasDesktop.UILogic.Helpers;

namespace GestorDeFlotasDesktop.AbmReloj
{
    public partial class frmFormReloj : BaseForm
    {
        Reloj RelojAModificar;
        frmListadoReloj FormPadre;
        public frmFormReloj(Reloj relojAModificar, frmListadoReloj formPadre)
        {
            RelojAModificar = relojAModificar;
            FormPadre = formPadre;
            InitializeComponent();
        }

        protected override void OnVisibleChanged(EventArgs e)
        {
            try
            {
                if (RelojAModificar != null)
                    RelojAModificar = Transaccion.Factoria<FactoriaReloj>().SelectXId<Reloj>(RelojAModificar.Id.ToString());
                base.OnVisibleChanged(e);
                CargarCombos();
                if (RelojAModificar != null)
                    CargarDatosEnForm();
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        private void CargarCombos()
        {
            List<string> marcas;
            if (Contexto.MarcasRelojes == null)
            {
                List<Reloj> autos = Transaccion.Factoria<FactoriaReloj>().SelectTodos<Reloj>();
                marcas = new List<string>();
                autos.ForEach(a => marcas.Add(a.Marca));
                marcas = marcas.Distinct().ToList();
                Contexto.MarcasRelojes = marcas;
            }
            else
                marcas = Contexto.MarcasRelojes;

            List<ComboBoxItem> items = new List<ComboBoxItem>();
            items.Add(new ComboBoxItem("", ""));
            foreach (string marca in marcas)
            {
                items.Add(new ComboBoxItem(marca, marca));
            }
            cmbMarca.ValueMember = "Value";
            cmbMarca.DisplayMember = "Text";
            cmbMarca.Items.AddRange(items.ToArray());
            cmbMarca.SelectedIndex = 0;
        }

        private void CargarDatosEnForm()
        {
            txtModelo.Text = RelojAModificar.Modelo;
            txtNroSerie.Text = RelojAModificar.NumeroDeSerie;
            cmbMarca.SelectedIndex = cmbMarca.FindStringExact(RelojAModificar.Marca);
            dtpFechaVerif.Value = RelojAModificar.FechaVerificacion;
            chkHabilitado.Checked = RelojAModificar.Habilitado;
        }

        private bool ValidarForm()
        {
            string error = string.Empty;

            if (string.IsNullOrEmpty(txtModelo.Text))
                error += "Debe completar el campo Modelo " + Environment.NewLine;

            if (string.IsNullOrEmpty(txtNroSerie.Text))
                error += "Debe completar el campo Numero de Serie " + Environment.NewLine;
            else if (txtNroSerie.Text.Length > 18)
                error += "El campo Numero de Serie no puede exceder los 18 caracteres" + Environment.NewLine;

            if (cmbMarca.SelectedItem == null || string.IsNullOrEmpty(((ComboBoxItem)cmbMarca.SelectedItem).Text))
                error += "Debe completar seleccionar una Marca " + Environment.NewLine;

            if (!string.IsNullOrEmpty(error))
                MessageBox.Show(error, "Reloj", MessageBoxButtons.OK, MessageBoxIcon.Error);

            if (RelojAModificar != null && (RelojAModificar.Habilitado && !chkHabilitado.Checked)) // si es modif, y antes estaba habilitado y ahora no..
            {
                List<Auto> autos = Transaccion.Factoria<FactoriaAuto>().SelectAutosConFiltro(null, null, null, null, RelojAModificar.Id);
                if (autos.Count > 0)
                    MessageBox.Show("El reloj que desea deshabilitar se encuentra asociado a por lo menos 1 auto", "Reloj", MessageBoxButtons.OK, MessageBoxIcon.Information);
            }
            return string.IsNullOrEmpty(error);
        }

        private string ConstruirError(string p)
        {
            string error = string.Empty;
            if (p.Contains("Violation of UNIQUE KEY constraint"))
                error = "ERROR: El campo Numero de Serie no puede estar repetido entre 2 relojes";
            else
                error = p;

            return error;
        }

        private void CargarReloj(Reloj RelojAModificar)
        {
            RelojAModificar.FechaVerificacion = dtpFechaVerif.Value;
            RelojAModificar.Habilitado = chkHabilitado.Checked;
            RelojAModificar.Marca = ((ComboBoxItem)cmbMarca.SelectedItem).Text;
            RelojAModificar.Modelo = txtModelo.Text;
            RelojAModificar.NumeroDeSerie = txtNroSerie.Text;
        }

        private void frmFormReloj_Load(object sender, EventArgs e)
        {

        }

        private void butGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                if (ValidarForm())
                {
                    if (RelojAModificar != null)
                    {
                        try
                        {
                            RelojAModificar = Transaccion.Factoria<FactoriaReloj>().SelectXId<Reloj>(RelojAModificar.Id.ToString());
                            CargarReloj(RelojAModificar);
                            Transaccion.Persistir();
                            MessageBox.Show("El reloj se ha guardado con exito");
                            if (FormPadre != null) FormPadre.CargarConFiltros();
                            this.Hide();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ConstruirError(ex.Message));
                        }
                    }
                    else
                        try
                        {
                            Reloj relojNuevo = Transaccion.Factoria<FactoriaReloj>().Nuevo(
                                                            ((ComboBoxItem)cmbMarca.SelectedItem).Value.ToString(),
                                                            txtModelo.Text,
                                                            txtNroSerie.Text,
                                                            chkHabilitado.Checked,
                                                            dtpFechaVerif.Value);
                            Transaccion.Persistir();
                            MessageBox.Show("El reloj se ha guardado con exito");

                            this.Hide();
                        }
                        catch (Exception ex)
                        {
                            MessageBox.Show(ConstruirError(ex.Message));
                        }
                }
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

    }
}
